/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package our.gui;

import java.awt.Container;
import java.awt.Font;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JComponent;

/**
 * Questa classe contiene le funzioni comuni a tutti gli oggetti posizionabili sul form
 * @author keysman
 */
public class commonObjectClass {
    private boolean _ISINKEYFRAME;      // Indica se l'oggetto in questione fa parte del Key frame
    private boolean _EXCLUDEDFROMALTER; // Questo flag serve per evitare che il contenuto del campo venga utilizzato come valore di verifica
                                                // nella funzione ALTER
    private boolean _ISFIRSTOUTOFKEYFRAME; // Indica se l'oggetto è quello che prende il fuoco appena il key frame è diabilitato

    private boolean _ISFIRSTKEY; // Indica la prima chiave (quella che possiede il fuoco appena la form viene aperta)

    private String _HELPMSG;

    private boolean _ISLASTINKEYFRAME; // Nel caso di più elementi nel keyframe, deve essere impostato a true solo per l'ultimo elemento del kf

    private Font _TXTFONT = new Font("Dialog", Font.PLAIN, 12);
    private int  _HEIGHT  = 40; // Altezza degli oggetti a video
    private static Font _ENTRYFIELDFONT = null;

    private our.gui.ourButton _BUTZOOM;

    private boolean _IS_ESC_KEY_PRESSED;
    
    private String _CLASSZOOM = null;

    private Object[] _OBJFILL = null; // Array contenente gli oggetti che verrano riempiti con i valori prelevati dallo zoom

    private String[] _STRRET = null; // Array contenente le colonne della griglia della linea selezionata

    private boolean _ZOOMONZOOM = false; // Indica se è attivo lo zoom on zoom

    private boolean _ISZOOM = false; // Indica se il campo è uno zoom
    
    private boolean _EMPTYIFNOTEXISTS = false; // Se un utente inserisce un valore in un ourTextField e questo non esiste, lo svuoto

    private ourForm _OURFORM = null; // Riferimento al frame contenitore

    private boolean _ISSHOW = false; // Indica se il campo è di visualizzazione pilotata o meno


    /**
     * Costruttore
     */
    public commonObjectClass()
    {
        _ISLASTINKEYFRAME = false;
        _BUTZOOM = null; // Per default non c'è un pulsante di zoom
        _IS_ESC_KEY_PRESSED = false; // Indica se è stato premuto il pulsante ESC quando il fuoco era sull'oggetto
        _HELPMSG = null;
        _ISINKEYFRAME = false;      // Indica se l'oggetto in questione fa parte del Key frame
        _EXCLUDEDFROMALTER = false; // Questo flag serve per evitare che il contenuto del campo venga utilizzato come valore di verifica
                                                // nella funzione ALTER
        _ISFIRSTOUTOFKEYFRAME = false; // Indica se l'oggetto è quello che prende il fuoco appena il key frame è diabilitato

        _ISFIRSTKEY = false; // Indica la prima chiave (quella che possiede il fuoco appena la form viene aperta)

        if(_ENTRYFIELDFONT==null) // Carico il font dal disco
        {
            // Carico il font Tahoma dal jar
            try
            {
                java.io.InputStream is = getClass().getResourceAsStream("/our/gui/fonts/tahoma.ttf");
                java.awt.Font fntTmp = java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, is);
                _ENTRYFIELDFONT = new java.awt.Font(fntTmp.getFontName(), java.awt.Font.BOLD, 11);
            } catch(Exception ex) { }
        }
    }

    public boolean setButZoomEnabled(boolean bEnable)
    {
        if(_BUTZOOM==null) return false;
        System.out.println("Imposto lo zoom su " + bEnable);
        _BUTZOOM.setEnabled(bEnable);
        return true;
    }

    /**
     * Indica se la variabile è di show, ovvero visualizza il contenuto 'esteso' di una query su db
     * @param _isshow true se è un campo di show, false (default) altrimenti
     */
    public void setIsShow(boolean _isshow)
    {
        _ISSHOW = _isshow;
    }

    /**
     * Indica se l'oggetto è un campo di show o meno
     * @return true è un campo di show, false altrimenti
     */
    public boolean isShow()
    {
        return _ISSHOW;
    }

    /**
     * Assegno al TextField un riferimento al frame contenitore
     * @param _ourForm Il frame contenente l'oggetto in questione
     */
    public void setOurForm(ourForm _ourForm)
    {
        _OURFORM = _ourForm;
    }

    /**
     * Resitituise il riferimento al contenitore
     * @return
     */
    public ourForm getOurForm()
    {
        return _OURFORM;
    }

    /**
     * Se in un oggetto di tipo ourTextField con zoom i viene inserito un valore che non esiste
     * e si desidera svuotare il campo (per evitare l'inserimento di un nuovo record nel caso di
     * record con chiavi composte da più chiavi) settare questo flag a true.
     * Esempio in formGestioneFatture.
     * @param EMPTYIFNOTEXISTS true se si vuole svuotare il campo inserendo un valore inesistente, false altrimenti
     */
    public void setEmptyIfNotExist(boolean EMPTYIFNOTEXISTS)
    {
        _EMPTYIFNOTEXISTS = EMPTYIFNOTEXISTS;
    }

    /**
     * Indica se il campo deve essere svuotato o meno quando l'utente inserisce un valore che non esiste
     * Esempio in formGestioneFatture.
     * @return true se il campo deve essere svuotato, false altrimenti
     */
    public boolean emptyIfNotExist()
    {
        return _EMPTYIFNOTEXISTS;
    }
    
    public static Object createObject(java.lang.reflect.Constructor constructor, Object[] arguments)
    {
        Object object = null;

        try {
            object = constructor.newInstance(arguments);
        } catch (InstantiationException e) {
        } catch (IllegalAccessException e) {
        } catch (IllegalArgumentException e) {
        } catch (InvocationTargetException e) {
        }   
        return object;
    }
    
    /**
     * Ritrna all'oggetto chiamante se è zoom on zoom o meno.
     * @return true se l'oggetto ammette ZoomOnZoom, false altrimenti
     */
    public boolean isZoomOnZoom()
    {
        return _ZOOMONZOOM;
    }

    public void setZoomOnZoom(boolean bZoomOnZoom)
    {
        _ZOOMONZOOM = bZoomOnZoom;
    }

    /**
     * Ritrna all'oggetto chiamante se è associato ad uno zoom
     * @return true se l'oggetto ammette Zoom, false altrimenti
     */
    public boolean isZoom()
    {
        return _ISZOOM;
    }

    /**
     * Chiamata al gestore dello zoom
     * @param str Stringa da cercare
     * @return Il codice
     */
    public String[] callZoomOnZoom(String str)
    {
        //if(_ZOOMONZOOM==false) return null;
        our.gui.ourZoom zoom;
        Class zoomDefinition;
        Class[] ArgsClass = new Class[] { java.awt.Frame.class, boolean.class, String.class };
        Object[] ArgsVals = new Object[] {new java.awt.Frame(), new Boolean(true), new String(str) };
        java.lang.reflect.Constructor ArgsConstructor;

        try {
            zoomDefinition = Class.forName(_CLASSZOOM);
            ArgsConstructor = zoomDefinition.getConstructor(ArgsClass);
            zoom = (our.gui.ourZoom)createObject(ArgsConstructor, ArgsVals);
            Object obj[] = new Object[] { str };
            //_STRRET = (String[]) zoom.CALLZOOM(obj);
            _STRRET = (String[]) zoom.CallZoom(obj);
            //_STRRET = (String[]) zoom.CALLZOOM(str);
            if( (_STRRET.length==1) && (_STRRET[0].length()==0) )
            {
                _STRRET = null;
            } else {
                zoom.findUsingKey(_STRRET[0]);
                _STRRET = zoom.getSelectedEntry();
            }
        } catch (ClassNotFoundException e) {
        } catch (NoSuchMethodException e) {
            System.out.println(e);
        }
        if(_OBJFILL!=null) fillObj(false); // Riempio eventuali campi di Show
        return _STRRET;
    }

    /**
     * Funzione chiamata da ourForm quando l'utente preme F2
     * @param str Indica il contenuto del text field
     * @param bHide false per visualizzare lo zoom, true per ricercare l'esistenza di un record
     * @return _STRRET Array contenente i campi che compongolo la PK
     */
    public String[] callZoom(String str, boolean bHide)
    {
        if( (_CLASSZOOM==null) || (str==null) ) return null;
        our.gui.ourZoom zoom;
        Class zoomDefinition;
        Class[] ArgsClass = new Class[] { java.awt.Frame.class, boolean.class, java.lang.String.class };
        Object[] ArgsVals = new Object[] {new java.awt.Frame(), new Boolean(true), new String(str) };
        java.lang.reflect.Constructor ArgsConstructor;
        try {
            zoomDefinition = Class.forName(_CLASSZOOM);
            ArgsConstructor = zoomDefinition.getConstructor(ArgsClass);
            zoom = (our.gui.ourZoom)createObject(ArgsConstructor, ArgsVals);
            if(bHide)
                zoom.findUsingKey(str);
            else
            {
                if(_ZOOMONZOOM)
                {
                    zoom.butZoom.setEnabled(true);
                    //zoom.setZoomOnZoom(true);
                }
                zoom.setVisible(true);
            }
            _STRRET = zoom.getSelectedEntry();
        } catch (ClassNotFoundException e) {
            System.out.println(e);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        if(_OBJFILL!=null) fillObj(false); // Riempio eventuali campi di Show
        return _STRRET;
    }

    public Font getEntryFieldFont()
    {
        return _ENTRYFIELDFONT;
    }

    /**
     * Restituisce l'oggetto ourButtom (zoomOn) se definito
     * @return ourButton, null altrimenti
     */
    public ourButton getZoomButtonObj()
    {
        return _BUTZOOM;
    }

    /**
     * Crea il pulsante dui zoom
     * @param CONT Contenitore al quale viene aggiunto il pulsante di zoom
     * @param cmp L'oggetto associato allo zoom
     * @param strZoomClas Il nome della classe zoom
     */
    public void zoomOn(Container CONT, JComponent cmp, String strZoomClass)
    {
        _ISZOOM = true;
        _BUTZOOM = new our.gui.ourButton();
        _BUTZOOM.setBounds(cmp.getX() + cmp.getWidth() + 3, cmp.getY() + 1, 18, 18);
        _BUTZOOM.setIcon(new javax.swing.ImageIcon(getClass().getResource("/our/gui/img/zoom.gif")));
        _BUTZOOM.setFocusable(false);
        _BUTZOOM.setText("");
        _BUTZOOM.setEnabled(false);
        if(isFieldInKeyFrame()) _BUTZOOM.SETTINGS.setFieldInKeyFrame(true); else _BUTZOOM.SETTINGS.setFieldInKeyFrame(false);
        //our.gui.ourPanel pnlParent = (our.gui.ourPanel)CONT;
        //if(pnlParent.isKeyFrame()) _BUTZOOM.SETTINGS.setFieldInKeyFrame(true);
        _BUTZOOM.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                if(!(_BUTZOOM.isEnabled())) return;
                try {
                    java.awt.Robot robot = new java.awt.Robot();
                    // Simulato la pressione del tasto F2
                    robot.keyPress(java.awt.event.KeyEvent.VK_F2);
                    robot.keyRelease(java.awt.event.KeyEvent.VK_F2);
                } catch (java.awt.AWTException e) { }
            }
        });
        _CLASSZOOM = strZoomClass;
        _OURFORM.addZoomOnButton(_BUTZOOM);
        CONT.add(_BUTZOOM);
    }

    /**
     * Crea il pulsante di zoom
     * @param CONT Contenitore al quale viene aggiunto il pulsante di zoom
     * @param cmp L'oggetto associato allo zoom
     * @param strZoomClas Il nome della classe zoom
     * @param objFill La lista degli oggetti che conterranno i valori prelevati dallo zoom
     */
    public void zoomOn(Container CONT, JComponent cmp, String strZoomClass, Object[] objFill)
    {
        zoomOn(CONT, cmp, strZoomClass);
        _OBJFILL = objFill;
    }

    /**
     * Crea il pulsante di zoom
     * @param CONT Contenitore al quale viene aggiunto il pulsante di zoom
     * @param cmp L'oggetto associato allo zoom
     * @param strZoomClas Il nome della classe zoom
     * @param objFill La lista degli oggetti che conterranno i valori prelevati dallo zoom
     * @param bZoomOnZoom True se è abilitato lo ZoomOnZoom, false altrimenti
     */
    public void zoomOn(Container CONT, JComponent cmp, String strZoomClass, Object[] objFill, boolean bZoomOnZoom)
    {
        zoomOn(CONT, cmp, strZoomClass, objFill);
        _ZOOMONZOOM = bZoomOnZoom;
    }
    
    public String fillObj(int iId)
    {
        return _STRRET[iId];
    }

    /**
     * Inserisco i valori letti dallo zoom nei campi (eventuali) del form
     * @param bEmpty true svuota il contenuto dei campi di show
     */
    public void fillObj(boolean bEmpty)
    {
        //if( (_OBJFILL==null) || (_STRRET==null) ) return;
        if(_OBJFILL==null) return; // Se la lista dei campi di show non è istanziata, ritorno
        for(int i=0; i<_OBJFILL.length; i++)
        {
            if(_OBJFILL[i]!=null)
            {
                String strOutput = "";
                if(_STRRET!=null) strOutput = _STRRET[i];
                if(bEmpty) strOutput = "";
                if(_OBJFILL[i] instanceof our.gui.ourLabel)
                    ((our.gui.ourLabel)_OBJFILL[i]).setText(strOutput);
                else
                    if(_OBJFILL[i] instanceof javax.swing.JLabel)
                        ((javax.swing.JLabel)_OBJFILL[i]).setText(strOutput);
                if(_OBJFILL[i] instanceof our.gui.ourTextField)
                    ((our.gui.ourTextField)_OBJFILL[i]).setText(strOutput);
                else
                    if(_OBJFILL[i] instanceof javax.swing.JTextField)
                        ((javax.swing.JTextField)_OBJFILL[i]).setText(strOutput);
            }
        }
    }

    /**
     * Svuota i campi di show
     */
    public void emptyFillObj()
    {
        if(_OBJFILL==null) return; // Se la lista dei campi di show non è istanziata, ritorno
        for(int i=0; i<_OBJFILL.length; i++)
        {
            if(_OBJFILL[i]!=null)
            {
                String strOutput = "";
                if(_OBJFILL[i] instanceof our.gui.ourLabel)
                    ((our.gui.ourLabel)_OBJFILL[i]).setText(strOutput);
                else
                    if(_OBJFILL[i] instanceof javax.swing.JLabel)
                        ((javax.swing.JLabel)_OBJFILL[i]).setText(strOutput);
                if(_OBJFILL[i] instanceof our.gui.ourTextField)
                    ((our.gui.ourTextField)_OBJFILL[i]).setText(strOutput);
                else
                    if(_OBJFILL[i] instanceof javax.swing.JTextField)
                        ((javax.swing.JTextField)_OBJFILL[i]).setText(strOutput);
            }
        }
    }

    /**
     * Restituisci l'altezza standard in pixel dell'oggetto
     * @return Altezza
     */
    public int getOurHeight()
    {
        return _HEIGHT;
    }

    /**
     * Ritorna il font usato nelle label, CheckBox ecc
     * @return Il Font
     */
    public Font getLabelFont()
    {
        return _TXTFONT;
    }


    /**
     * public void setIsFirstOutOfKeyFrame(boolean bIsFirst)
     *
     * Imposta la proprietà di essere il campo con il fuoco una volta 'bloccato' il key frame
     * @param bIsFirst true se il campo prende il fuoco appena il key frame è disabilitato, false altrimenti
     */
    public void setIsFirstOfKeyFrame(boolean bIsFirst)
    {
        _ISFIRSTKEY = bIsFirst;
    }

    /**
     * Imposta il tooltip dell'oggetto
     * @param strHelpMsg
     */
    public void setHelpMsg(String strHelpMsg)
    {
        _HELPMSG = strHelpMsg;
    }

    /**
     * Preleva la stringa da inserire nel tooltip
     * @return Il tooltip
     */
    public String getHelpMsg()
    {
        return _HELPMSG;
    }

    /**
     * @return true se al campo è associato un pulsante di zoom, false altrimenti
     */
    public boolean getIsZoom()
    {
        if(_BUTZOOM==null)
            return false;
        return true;
    }

    /**
     * Abilita/Disabilita l'eventuale pulsante di Zoom
     * @param bEnable true per abilitare il pulsante di zoom, false altrimenti
     */
    public void enableZoomButton(boolean bEnable)
    {
        if(_BUTZOOM==null) return;
        _BUTZOOM.setEnabled(bEnable);
        if(_OURFORM!=null) _OURFORM.butZoom.setEnabled(bEnable);
    }

    /**
     * Imposta il flag per la pressione del pulsante ESC
     * @param bPressed true se è stato premuto ESC, false altrimenti
     */
    public void setEscKeyPressed(boolean bPressed)
    {
        _IS_ESC_KEY_PRESSED = bPressed;
    }

    /**
     * Ritorna se è stato premuto il pulsante ESC
     * @return true se è stato premuto ESC, false altrimenti
     */
    public boolean isEscKeyPressed()
    {
        return _IS_ESC_KEY_PRESSED;
    }

    /**
     * public boolean getIsFirstOutOfKeyFrame()
     *
     * @return true se il campo deve prendere il fuoco appena il key frame viene diabilitato
     */
    public boolean getIsFirstOfKeyFrame()
    {
        return _ISFIRSTKEY;
    }
    
    /**
     * public void setIsFirstOutOfKeyFrame(boolean bIsFirst)
     * 
     * Imposta la proprietà di essere il campo con il fuoco una volta 'bloccato' il key frame
     * @param bIsFirst true se il campo prende il fuoco appena il key frame è disabilitato, false altrimenti
     */
    public void setIsFirstOutOfKeyFrame(boolean bIsFirst)
    {
        _ISFIRSTOUTOFKEYFRAME = bIsFirst;
    }
    
    
    /**
     * public boolean getIsFirstOutOfKeyFrame()
     * 
     * @return true se il campo deve prendere il fuoco appena il key frame viene diabilitato
     */
    public boolean getIsFirstOutOfKeyFrame()
    {
        return _ISFIRSTOUTOFKEYFRAME;
    }
    
    /**
     * Imposta il campo come appartenente al gruppo di elementi della form utile al test in ALTER
     * @param bExclude true se il campo non comporta verifica nella procedura ALTER
     */
    public void setExcludeFieldFromAlterCheck(boolean bExclude)
    {
        _EXCLUDEDFROMALTER = bExclude;
    }

    /**
     * Restituisce true se il contenuto del campo non deve essere comparato in fase di controllo di eventuali mdifiche
     * @return true se il campo è escluso, false altrimenti
     */
    public boolean isExcludedFormAlter()
    {
        return _EXCLUDEDFROMALTER;
    }

    /**
     * Imposta il campo come appartenente al key frame
     * @param bValue true se il campo appartiene al keyframe, false altrimenti
     */
    public void setFieldInKeyFrame(boolean bValue)
    {
        _ISINKEYFRAME = bValue;
        if(bValue) // Se l'oggetto appartiene al keyframe per default lo considero come l'ultimo (o unico)
            _ISLASTINKEYFRAME = true;
    }

    /**
     * Imposta l'elemento corrente come l'ultimo del keyframe: ovvero se l'utente premo "DOWN" si cambia modalità.
     * E' importante notare che se ci sono più elementi nel keyframe, solo uno deve avere questa proprietà settata a true
     * @param bValue true se è l'ultimo elemento, false altrimenti
     */
    public void setLastElementInKeyFrame(boolean bValue)
    {
        _ISLASTINKEYFRAME = bValue;
    }

    /**
     * Restituisce se l'oggetto è l'ultimo' del keyframe o meno
     * @return true se l'elemento è l'ultimo del keyframe, false altrimenti
     */
    public boolean isLastElementInKeyFrame()
    {
        return _ISLASTINKEYFRAME;
    }

    /**
     * Restituisce l'appartenenza o meno del campo al keyframe
     * @return true se il campo appartiene al keyframe, false altrimenti
     */
    public boolean isFieldInKeyFrame()
    {
        return _ISINKEYFRAME;
    }
}
